<?php

function pagination($pageCount, $itemsPerPage = 20, $pageUrl = '', $curPage = 1, $maxButtons = 0) {
    
    $paginationHtml = '';
    $paginationHtmlStart = "<nav><ul class='pagination'>";
    $paginationHtmlEnd = "</ul></nav>";
    $firstBtn = '';
    $prevBtn = '';
    $nextBtn = '';
    $lastBtn = '';
    $btns = array();
    $startPage = 0;

    if ($pageCount <= 1) {
        return null;
    } else if ($pageCount <= $maxButtons) {
        if ($curPage == 1) {
            for ($i=2; $i<=$pageCount; $i++) {
                $btns[$i] = "<li><a href='".paginationUrl($pageUrl, $i)."'>".$i."</a></li>";
            }
            $btns[1] = "<li class='active'><a href='".paginationUrl($pageUrl, 1)."'>1</a></li>";
            $nextBtn = "<li><a href='".paginationUrl($pageUrl, $curPage+1)."'>Next</a></li>";
            $lastBtn = "<li><a href='".paginationUrl($pageUrl, $pageCount)."'>Last</a></li>";
        } else if ($curPage == $pageCount) {
            for ($i=1; $i<$pageCount; $i++) {
                $btns[$i] = "<li><a href='".paginationUrl($pageUrl, $i)."'>".$i."</a></li>";
            }
            $btns[$pageCount] = "<li class='active'><a href='".paginationUrl($pageUrl, $pageCount)."'>".$pageCount."</a></li>";
            $prevBtn = "<li><a href='".paginationUrl($pageUrl, $curPage-1)."'>Prev</a></li>";
            $firstBtn = "<li><a href='".paginationUrl($pageUrl, 1)."'>First</a></li>";
        } else {
            $firstBtn = "<li><a href='".paginationUrl($pageUrl, 1)."'>First</a></li>";
            $prevBtn = "<li><a href='".paginationUrl($pageUrl, $curPage-1)."'>Prev</a></li>";
            for ($i=1; $i<=$pageCount; $i++) {
                if ($i != $curPage) {
                    $btns[$i] = "<li><a href='".paginationUrl($pageUrl, $i)."'>".$i."</a></li>";
                } else {
                    $btns[$i] = "<li class='active'><a href='".paginationUrl($pageUrl, $i)."'>".$i."</a></li>";
                }
            }
            $nextBtn = "<li><a href='".paginationUrl($pageUrl, $curPage+1)."'>Next</a></li>";
            $lastBtn = "<li><a href='".paginationUrl($pageUrl, $pageCount)."'>Last</a></li>";
        }
    } else if ($pageCount > $maxButtons) {
        if ($maxButtons%2 == 0) {
            $pageLength = $maxButtons / 2;
        } else {
            $pageLength = ($maxButtons - 1) / 2;
        }

        if ($curPage != 1) {
            $firstBtn = "<li><a href='".paginationUrl($pageUrl, 1)."'>First</a></li>";
            if ($curPage <= $pageLength+1) {
                $prevBtn = "<li><a href='".paginationUrl($pageUrl, $curPage-1)."'>Prev</a></li>";
            } else {
                $prevBtn = "<li><a href='".paginationUrl($pageUrl, $curPage-1)."'>Prev</a></li><li class='disabled'><a href='#'>...</a></li>";
            }
        }

        if ($curPage <= $pageLength) {
            $startPage = 1;
        } else {
            $startPage = $curPage - $pageLength;
        }

        if ($curPage >= $pageCount-$pageLength) {
            $endPage = $pageCount;
        } else {
            $endPage = $curPage + $pageLength;
        }
        

        for ($i=$startPage; $i<=$endPage; $i++) {
            if ($i != $curPage) {
                $btns[$i] = "<li><a href='".paginationUrl($pageUrl, $i)."'>".$i."</a></li>";
            } else {
                $btns[$i] = "<li class='active'><a href='".paginationUrl($pageUrl, $curPage)."'>".$curPage."</a></li>";
            }
        }

        if ($curPage != $pageCount) {
            if ($curPage >= $pageCount-$pageLength) {
                $nextBtn = "<li><a href='".paginationUrl($pageUrl, $curPage+1)."'>Next</a></li>";
            } else {
                $nextBtn = "<li class='disabled'><a href='#'>...</a></li><li><a href='".paginationUrl($pageUrl, $curPage+1)."'>Next</a></li>";
            }
            $lastBtn = "<li><a href='".paginationUrl($pageUrl, $pageCount)."'>Last</a></li>";
        }
    }
    
    $paginationHtml .= $paginationHtmlStart;
    $paginationHtml .= $firstBtn;
    $paginationHtml .= $prevBtn;
    if (count($btns) > 0) {
        if ($startPage == 0) {
            for ($i=1; $i<=count($btns); $i++) {
                $paginationHtml .= $btns[$i];
            }
        } else {
            for ($i=$startPage; $i<=$startPage+count($btns); $i++) {
                $paginationHtml .= $btns[$i];
            }
        }
    }
    $paginationHtml .= $nextBtn;
    $paginationHtml .= $lastBtn;
    $paginationHtml .= $paginationHtmlEnd;

    return $paginationHtml;
}

function paginationUrl($pageUrl = '', $pageOffset = 0) {
    
    if ($pageOffset == 0) {
        return false;
    } else {
        return U($pageUrl, 'p='.$pageOffset);
    }
}
